
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

/*
 * Contiene una seria di JBlocco e permette di muoverli all'interno del JPanel che li contiene
 * e di sapere se sono nella posizione corretta dichiarata durante la costruzione dell'oggetto
 */

public class JBlocchi extends JPanel implements ActionListener{

    ArrayList <String> blocchi; //le stringe contenenti i passaggi dell'algoritmo passate da chi genera l'oggetto
    ArrayList <JBlocco> jblocchi; //array di JBlocco, uno per ogni stringa

    JPanel jp;   //pannello su cui disporre i JBlocco

    //il costruttore accetta delle stringhe che verranno impostate una su ogni JBlocco
    public JBlocchi(ArrayList <String> b)
    {
        super();
        blocchi = b;
        initComponents();

    }

    //aggiunge i JBlocco al pannello,

    private void addBlocchi(){
        for(int i=0;i<jblocchi.size();i++)
        {
            JBlocco jblocco = jblocchi.get(i);
            jblocco.setID(new Integer(i));
            jp.add(jblocco);
        }

    }

    //controlla se per ogni blocco i suoi indici iniziale e corrente coincidono
    public boolean indiciCoincidono()
    {
        for(JBlocco jb:jblocchi) if(!jb.indiceCoincide()) return false;
        return true;
    }

    private void initComponents() {

        jp = new JPanel();
        jp.setLayout(new BoxLayout(jp,BoxLayout.Y_AXIS ));
        jblocchi = new ArrayList <JBlocco> ();

        //inizializzo i JBlocco 
        //ogni blocco viene inizializzato con la stringa contenente il pezzo di algoritmo e la sua reale posizione
        for(int i=0;i<blocchi.size();i++)
        {
            String s = blocchi.get(i);
            JBlocco jblocco = new JBlocco(i,s,this); 
            jblocchi.add(jblocco);
            jblocco.setAlignmentX(Component.LEFT_ALIGNMENT);

        }

        Collections.shuffle(jblocchi); //mescolo l'array (ma chiaramente non i jblocco.realId)

        addBlocchi();  //aggiunge i blocchi al pannello
        this.add(jp); //aggiunge il pannello al pannello(this)
    }

    //riceve i click ai pulsanti dei JBlocco

    public void actionPerformed(ActionEvent e) {
        JButton srcBottone =  (JButton)e.getSource();
        Object srcBlocco = (srcBottone).getParent();

        for(int i=0;i<jblocchi.size();i++)
        {
            JBlocco jb=jblocchi.get(i);

            if(jb==srcBlocco)
            {
                if(jb.su==srcBottone && i>0) 
                //se il pulsante premuto e' "su", scambia questo blocco con quello precedente e quindi 
                //funziona solo se il blocco non e' il primo.
                {
                    //scambia currentID e descrizione tra i due blocchi
                    JBlocco dest = (JBlocco) jp.getComponent(i-1);
                    String tmp = new String( dest.getDescrizione());
                    int realId=dest.getRealId();
                    dest.set(i-1,jb.getRealId(),jb.getDescrizione());
                    jb.set(i,realId,tmp);
                }
                if(jb.giu==srcBottone && i<(jblocchi.size()-1))
                {
                    //se il pulsante premuto e' "giu", scambia questo blocco con quello sucessivo e e quindi 
                    //funziona solo se il blocco non e' l'ultimo.

                    //scambia currentID e descrizione tra i due blocchi
                    JBlocco dest = (JBlocco) jp.getComponent(i+1);
                    String tmp = new String( dest.getDescrizione());
                    int realId=dest.getRealId();
                    dest.set(i+1,jb.getRealId(),jb.getDescrizione());
                    jb.set(i,realId,tmp);
                }

                return;
            }
        }

    }

}
